/*!
 * \file IRdmDtReader.h
 * \project	WonderTrader
 *
 * \author Wesley
 * \date 2020/03/30
 * 
 * \brief 随机数据读取接口定义
 * \details 定义了随机数据读取模块的核心接口，包括随机数据读取回调和主要数据读取功能
 */
#pragma once
#include <stdint.h>

#include "../Includes/WTSMarcos.h"
#include "../Includes/WTSTypes.h"

NS_WTP_BEGIN
class WTSKlineSlice;
class WTSTickSlice;
class WTSOrdQueSlice;
class WTSOrdDtlSlice;
class WTSTransSlice;
class IBaseDataMgr;
class IHotMgr;
class WTSVariant;


/**
 * @class IRdmDtReaderSink
 * @brief 随机数据读取模块回调接口
 * @details 定义了随机数据读取模块与其他模块交互的回调接口。
 *          主要功能包括：
 *          - 基础数据管理器访问
 *          - 热门合约管理器访问
 *          - 日志输出
 *          
 *          该接口由数据使用方实现，用于接收随机数据读取模块的通知和提供相关服务。
 */
class IRdmDtReaderSink
{
public:
	/**
	 * @brief 获取基础数据管理接口指针
	 * @details 提供访问基础数据管理器的接口，用于获取合约信息、品种信息等基础数据。
	 * 
	 * @return IBaseDataMgr* 基础数据管理器指针
	 */
	virtual IBaseDataMgr*	get_basedata_mgr() = 0;

	/**
	 * @brief 获取主力热门合约管理接口指针
	 * @details 提供访问热门合约管理器的接口，用于获取主力合约、热门合约信息。
	 * 
	 * @return IHotMgr* 热门合约管理器指针
	 */
	virtual IHotMgr*		get_hot_mgr() = 0;

	/**
	 * @brief 输出随机数据读取模块日志
	 * @details 用于随机数据读取模块输出日志信息。
	 * 
	 * @param ll 日志级别
	 * @param message 日志消息内容
	 */
	virtual void		reader_log(WTSLogLevel ll, const char* message) = 0;
};

/**
 * @class IRdmDtReader
 * @brief 随机数据读取接口
 * @details 随机数据读取模块提供的核心数据（tick和K线）读取接口。
 *          主要功能包括：
 *          - 模块初始化和配置
 *          - 按时间范围读取各类市场数据切片
 *          - 按数量读取各类市场数据切片
 *          - 支持委托明细、委托队列、成交明细等Level2数据
 *          
 *          该接口是随机数据读取模块的核心，由具体的数据存储实现类继承。
 *          与IBtDtReader不同，IRdmDtReader用于随机场景，
 *          支持更丰富的数据读取方式和数据类型。
 */
class IRdmDtReader
{
public:
	IRdmDtReader() :_sink(NULL) {}
	virtual ~IRdmDtReader(){}

public:
	/**
	 * @brief 初始化随机数据读取模块
	 * @details 使用配置参数初始化随机数据读取模块，设置回调接口。
	 * 
	 * @param cfg 模块配置参数
	 * @param sink 模块回调接口
	 */
	virtual void init(WTSVariant* cfg, IRdmDtReaderSink* sink) { _sink = sink; }

	/**
	 * @brief 按时间范围读取委托明细切片
	 * @details 从数据存储中读取指定合约和时间范围的委托明细数据切片。
	 * 
	 * @param stdCode 标准合约代码
	 * @param stime 开始时间（Unix时间戳）
	 * @param etime 结束时间（Unix时间戳），默认为0表示读取到最新
	 * @return WTSOrdDtlSlice* 委托明细数据切片指针
	 */
	virtual WTSOrdDtlSlice*	readOrdDtlSliceByRange(const char* stdCode, uint64_t stime, uint64_t etime = 0) = 0;
	
	/**
	 * @brief 按时间范围读取委托队列切片
	 * @details 从数据存储中读取指定合约和时间范围的委托队列数据切片。
	 * 
	 * @param stdCode 标准合约代码
	 * @param stime 开始时间（Unix时间戳）
	 * @param etime 结束时间（Unix时间戳），默认为0表示读取到最新
	 * @return WTSOrdQueSlice* 委托队列数据切片指针
	 */
	virtual WTSOrdQueSlice*	readOrdQueSliceByRange(const char* stdCode, uint64_t stime, uint64_t etime = 0) = 0;
	
	/**
	 * @brief 按时间范围读取成交明细切片
	 * @details 从数据存储中读取指定合约和时间范围的成交明细数据切片。
	 * 
	 * @param stdCode 标准合约代码
	 * @param stime 开始时间（Unix时间戳）
	 * @param etime 结束时间（Unix时间戳），默认为0表示读取到最新
	 * @return WTSTransSlice* 成交明细数据切片指针
	 */
	virtual WTSTransSlice*	readTransSliceByRange(const char* stdCode, uint64_t stime, uint64_t etime = 0) = 0;

	/**
	 * @brief 按时间范围读取tick数据切片
	 * @details 从数据存储中读取指定合约和时间范围的tick数据切片。
	 * 
	 * @param stdCode 标准合约代码
	 * @param stime 开始时间（Unix时间戳）
	 * @param etime 结束时间（Unix时间戳），默认为0表示读取到最新
	 * @return WTSTickSlice* tick数据切片指针
	 */
	virtual WTSTickSlice*	readTickSlicesByRange(const char* stdCode, uint64_t stime, uint64_t etime = 0) = 0;
	
	/**
	 * @brief 按时间范围读取K线数据切片
	 * @details 从数据存储中读取指定合约、周期和时间范围的K线数据切片。
	 * 
	 * @param stdCode 标准合约代码
	 * @param period K线周期
	 * @param stime 开始时间（Unix时间戳）
	 * @param etime 结束时间（Unix时间戳），默认为0表示读取到最新
	 * @return WTSKlineSlice* K线数据切片指针
	 */
	virtual WTSKlineSlice*	readKlineSliceByRange(const char* stdCode, WTSKlinePeriod period, uint64_t stime, uint64_t etime = 0) = 0;

	/**
	 * @brief 按数量读取tick数据切片
	 * @details 从数据存储中读取指定合约和数量的最新tick数据切片。
	 * 
	 * @param stdCode 标准合约代码
	 * @param count 读取数量
	 * @param etime 结束时间（Unix时间戳），默认为0表示读取到最新
	 * @return WTSTickSlice* tick数据切片指针
	 */
	virtual WTSTickSlice*	readTickSlicesByCount(const char* stdCode, uint32_t count, uint64_t etime = 0) = 0;
	
	/**
	 * @brief 按数量读取K线数据切片
	 * @details 从数据存储中读取指定合约、周期和数量的最新K线数据切片。
	 * 
	 * @param stdCode 标准合约代码
	 * @param period K线周期
	 * @param count 读取数量
	 * @param etime 结束时间（Unix时间戳），默认为0表示读取到最新
	 * @return WTSKlineSlice* K线数据切片指针
	 */
	virtual WTSKlineSlice*	readKlineSliceByCount(const char* stdCode, WTSKlinePeriod period, uint32_t count, uint64_t etime = 0) = 0;

protected:
	IRdmDtReaderSink*	_sink;		///< 随机数据读取回调接口
};

/**
 * @typedef FuncCreateRdmDtReader
 * @brief 创建随机数据读取器函数指针类型
 * @details 用于动态库中创建随机数据读取器实例的函数指针。
 */
typedef IRdmDtReader* (*FuncCreateRdmDtReader)();

/**
 * @typedef FuncDeleteRdmDtReader
 * @brief 删除随机数据读取器函数指针类型
 * @details 用于动态库中删除随机数据读取器实例的函数指针。
 * 
 * @param store 要删除的随机数据读取器指针
 */
typedef void(*FuncDeleteRdmDtReader)(IRdmDtReader* store);

NS_WTP_END